home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / C / System / Talking Clock Pro™ 2.0b2 / Talking Clock Pro Source / Controller / Source / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-04  |  4.7 KB  |  223 lines  |  [TEXT/KAHL]

  1. /*
  2.  * main.c
  3.  */
  4.  
  5. #include "window.h"
  6. #include "apprec.h"
  7. #include "clockrec.h"
  8. #include "x.h"
  9. #include "str.h"
  10. #include "menu.h"
  11. #include "util.h"
  12. #include "TalkConstants.h"
  13.  
  14.  
  15. /* This will be used as a breathing hole for the error reporting routine */
  16. static Handle err_safeguard = NULL ;
  17.  
  18. void InstallAEHandlers ( void ) ;
  19.  
  20.  
  21.  
  22. static void
  23. InitMac ( void ) {
  24.  
  25.     MaxApplZone ( ) ;
  26.     MoreMasters ( ) ;
  27.  
  28.     InitGraf ( & qd . thePort ) ;
  29.     InitFonts ( ) ;
  30.     InitWindows ( ) ;
  31.     InitMenus ( ) ;
  32.     TEInit ( ) ;
  33.     InitDialogs ( NULL ) ;
  34.  
  35.     InitCursor ( ) ;
  36. }
  37.  
  38.  
  39. static void
  40. InitApp ( DefWindowRec * theApp ) {
  41.  
  42. FSSpec prefFile ;
  43. short vRefNum ;
  44. long parID ;
  45. Str63 name ;
  46.  
  47.     gMouse = NewRgn ( ) ;
  48.     FailNil ( gMouse ) ;
  49.     CopyRgn ( GetGrayRgn ( ) , gMouse ) ;
  50.     gDragLimit = ( * GetGrayRgn ( ) ) -> rgnBBox ;
  51.     InsetRect ( & gDragLimit , 3 , 3 ) ;
  52.     gSizeLimit = gDragLimit ;
  53.     OffsetRect ( & gSizeLimit , - gSizeLimit . left , - gSizeLimit . top ) ;
  54.     gSizeLimit . top = 100 ;
  55.     gSizeLimit . left = 150 ;
  56.     gSizeLimit . bottom -= GetMBarHeight ( ) ;
  57.     if ( gSizeLimit . right > 512 ) {
  58.         gSizeLimit . right -= 32 ;
  59.     }
  60.  
  61.     MakeMenus ( ) ;
  62.     StrGet ( 128 , name , 63 ) ;
  63.     FailErr ( FindFolder ( kOnSystemDisk , kPreferencesFolderType , kCreateFolder ,
  64.         & vRefNum , & parID ) ) ;
  65.     FSMakeFSSpec ( vRefNum , parID , name , & prefFile ) ;
  66.     app = * theApp ;
  67.     ( * app . OnCreate ) ( NULL , & app . data , & prefFile ) ;
  68. }
  69.  
  70.  
  71. static void
  72. QuitApp ( void ) {
  73.  
  74.     ( * app . OnDestroy ) ( NULL , app . data ) ;
  75. }
  76.  
  77.  
  78. static void
  79. ReportError ( short errCode , Boolean toQuit ) {
  80.  
  81. StringHandle h = GetString ( errCode ) ;
  82. Str15 code ;
  83. StringHandle num ;
  84. Str31 fileStr ;
  85. Str15 lineStr ;
  86.  
  87.     DisposeHandle ( err_safeguard ) ;
  88.     if ( ! h ) {
  89.         h = GetString ( 129 ) ; /* What do we do if this fails !? */
  90.     }
  91.     HLock ( ( Handle ) h ) ;
  92.     NumToString ( errCode , code ) ;
  93.     num = GetString ( 130 ) ;
  94.     if ( num ) {
  95.         PtrAndHand ( ( Ptr ) & code [ 1 ] , ( Handle ) num , code [ 0 ] ) ;
  96.         * * num += code [ 0 ] ;
  97.         HLock ( ( Handle ) num ) ;
  98.     }
  99.  
  100. #ifdef FAILINFO
  101.     NumToString ( __err_line , lineStr ) ;
  102.     CopyC2P ( __err_file , fileStr ) ;
  103. #else
  104.     lineStr [ 0 ] = fileStr [ 0 ] = 0 ;
  105. #endif
  106.  
  107.     ParamText ( h ? * h : NULL , num ? * num : NULL , fileStr , lineStr ) ;
  108.     if ( num ) {
  109.         ReleaseResource ( ( Handle ) num ) ;
  110.     }
  111.     if ( h ) {
  112.         ReleaseResource ( ( Handle ) h ) ;
  113.     }
  114.     if ( ! InFront ( ) ) {
  115.         Notify ( ) ;
  116.     }
  117.     Alert ( 128 , NULL ) ;
  118.     HiliteMenu ( 0L ) ; /* For failures during menu selections */
  119.     ParamText ( NULL , NULL , NULL , NULL ) ;
  120.     err_safeguard = NewHandle ( 1024 ) ;
  121. }
  122.  
  123.  
  124. static void
  125. CheckVersions ( void ) {
  126.  
  127. #if 1
  128. /* These are the typical System-7 checks (we assume System 6 which means
  129.  * WaitNextEvent is always implemented etc.)
  130.  */
  131. Boolean fine = 1 ;
  132.  
  133.     fine = fine && CheckGestaltBit ( gestaltFindFolderAttr , gestaltFindFolderPresent ) ;
  134.     fine = fine && CheckGestaltBit ( gestaltAppleEventsAttr , gestaltAppleEventsPresent ) ;
  135.     fine = fine && CheckGestaltBit ( gestaltAliasMgrAttr , gestaltAliasMgrPresent ) ;
  136.     fine = fine && CheckGestaltBit ( gestaltOSAttr , gestaltLaunchControl ) ;
  137.     fine = fine && CheckGestaltBit ( gestaltOSAttr , gestaltRealTempMemory ) ;
  138.     fine = fine && CheckGestaltBit ( gestaltOSAttr , gestaltTempMemTracked ) ;
  139.     fine = fine && SpeechAvailable ( ) ;
  140.     if ( ! fine ) {
  141.         Alert ( 131 , NULL ) ;
  142.         ExitToShell ( ) ;
  143.     }
  144. #endif
  145. }
  146.  
  147.  
  148. void
  149. main ( ) {
  150.  
  151. WindowPtr wp ;
  152.  
  153.     InitMac ( ) ;
  154.     CheckVersions ( ) ;
  155.     err_safeguard = NewHandle ( 1024 ) ;
  156.     InstallAEHandlers ( ) ;
  157.     TRY {
  158.         InitApp ( & appRec ) ;
  159.     runAgain :
  160.         while ( ! quit ) {
  161.             TRY {
  162.                 DriveWindow ( ) ;
  163.                 if ( InFront ( ) ) {
  164.                     DeNotify ( ) ;
  165.                 }
  166.             } CATCH {
  167.                 ReportError ( __err , 0 ) ;
  168.                 NO_PROPAGATE ;
  169.             } DONE ;
  170.         }
  171.         AppSaveWindows ( app . data ) ;
  172.         while ( wp = FrontWindow ( ) ) {
  173.         short err ;
  174.             if ( err = DestroyWindow ( wp ) ) {
  175.                 quit = 0 ;
  176.                 ReportError ( err , 0 ) ;
  177.                 goto runAgain ;
  178.             }
  179.         }
  180.         QuitApp ( ) ;
  181.     } CATCH {
  182.         ReportError ( __err , 1 ) ;
  183.         NO_PROPAGATE ;
  184.     } DONE ;
  185. }
  186.  
  187.  
  188. static pascal OSErr
  189. AEOpenApplication ( AppleEvent * event , AppleEvent * reply , long refCon ) {
  190.  
  191. ProcessSerialNumber psn ;
  192. extern Boolean hasController ;
  193.  
  194.     if ( FrontWindow ( ) ) {
  195.         if ( FindPSN ( 'FNDR' , 'MACS' , & psn ) ) {
  196.             FailErr ( SetFrontProcess ( & psn ) ) ;
  197.         }
  198.     } else if ( ! hasController ) {
  199.     WindowPtr wp = MakeWindow ( NULL , & clockRec ) ;
  200.         SelectWindow ( wp ) ;
  201.         ShowWindow ( wp ) ;
  202.     }
  203.     return noErr ;
  204. }
  205.  
  206.  
  207. static pascal OSErr
  208. AEQuitApplication ( AppleEvent * event , AppleEvent * reply , long refCon ) {
  209.  
  210.     quit = 1 ;
  211.     return noErr ;
  212. }
  213.  
  214.  
  215. static void
  216. InstallAEHandlers ( void ) {
  217.  
  218.     FailErr ( AEInstallEventHandler ( kCoreEventClass , kAEOpenApplication ,
  219.         AEOpenApplication , 0L , 0 ) ) ;
  220.     FailErr ( AEInstallEventHandler ( kCoreEventClass , kAEQuitApplication ,
  221.         AEQuitApplication , 0L , 0 ) ) ;
  222. }
  223.